package Negocio;

import java.util.Collection;

import ClassesBasicas.Agenda;
import ClassesBasicas.Consulta;
import ClassesBasicas.Convenio;
import ClassesBasicas.Exames;
import ClassesBasicas.Historico;
import ClassesBasicas.Laboratorio;
import ClassesBasicas.Pessoa;
import DAO.RepositorioAgenda;
import DAO.RepositorioConsulta;
import DAO.RepositorioConvenio;
import DAO.RepositorioExame;
import DAO.RepositorioLaboratorio;
import DAO.RepositorioPessoa;
import Excecao.AgendaExistenteException;
import Excecao.AgendaInexistenteException;
import Excecao.ConsultaExistenteException;
import Excecao.ConsultaInexistenteException;
import Excecao.ConvenioExistenteException;
import Excecao.ConvenioInexistenteException;
import Excecao.ExameExistenteException;
import Excecao.ExameInexistenteException;
import Excecao.LaboratorioExistenteException;
import Excecao.LaboratorioInexistenteException;
import Excecao.PessoaExistenteException;
import Excecao.PessoaInexistenteException;

public class Fachada {
private static Fachada instancia;
	
	private CadastroPessoa pessoas;
	private CadastroAgenda agendas;
	private CadastroConvenio convenios;
	private CadastroLaboratorio laboratorios;
	private CadastroExames exames;
	private CadastroConsulta consultas;

	private Fachada() {
		initCadastros();
	}

	private void initCadastros() {
		
		RepositorioPessoa rep = new RepositorioPessoa();
		pessoas = new CadastroPessoa(rep);
		RepositorioAgenda repAgenda = new RepositorioAgenda();
		agendas = new CadastroAgenda(repAgenda);
		RepositorioConvenio repConvenio = new RepositorioConvenio();
		convenios = new CadastroConvenio(repConvenio);
		RepositorioLaboratorio repLab = new RepositorioLaboratorio();
		laboratorios = new CadastroLaboratorio(repLab);
		RepositorioExame repExame= new RepositorioExame();
		exames = new CadastroExames(repExame);
		RepositorioConsulta repConsulta= new RepositorioConsulta();
		consultas = new CadastroConsulta(repConsulta);
	}
	
	public static Fachada obterInstancia() {
		if (instancia == null) {
			instancia = new Fachada();
		}
		return instancia;
	}

	//PESSOAS
	public void atualizar(Pessoa pessoa, String tipo) throws PessoaInexistenteException {
		pessoas.atualizar(pessoa, tipo);
	}

	public Pessoa procurar(String cpf, String tipo) throws PessoaInexistenteException {
		return pessoas.procurar(cpf, tipo);
	}
	public void cadastrar(Pessoa pessoa, String tipo) throws PessoaExistenteException {
		pessoas.cadastrar(pessoa, tipo);
	}

	public void remover(String cpf, String tipo) throws PessoaInexistenteException {
		pessoas.descadastrar(cpf, tipo);
	}
	
	public Collection <? extends Pessoa> listar(String tipo) {
		return pessoas.listar(tipo);
	}
	
	public Pessoa procurarPessoaNome(String nome)throws PessoaInexistenteException{
		return pessoas.procurarPessoaNome(nome);
	}
	
	public Collection<Historico> consultarHistoricos(String cpf){
		return pessoas.consultarHistoricos(cpf);
		
	}
	
	public void inserirHistoricos(Historico h){
		pessoas.inserirHistorico(h);
	}

	// AGENDA
	public void cadastrarAgenda(Agenda agenda) throws AgendaExistenteException {
		agendas.cadastrar(agenda);
	}	
	public void removerAgenda(int cod) throws AgendaInexistenteException {
		agendas.descadastrar(cod);
	}
	public void atualizar(Agenda agenda) throws AgendaInexistenteException {
		agendas.atualizar(agenda);
	}
	public Agenda procurar(int cod) throws AgendaInexistenteException {
		return agendas.procurar(cod);
	}
	
	// CONVENIO
	public void cadastrar(Convenio convenio) throws ConvenioExistenteException {
		convenios.cadastrar(convenio);
	}	
	public void remover(String nome) throws ConvenioInexistenteException {
		convenios.descadastrar(nome);
	}
	public void atualizar(Convenio convenio) throws ConvenioInexistenteException {
		convenios.atualizar(convenio);
	}
	public Convenio procurarConvenio(String nome) throws ConvenioInexistenteException {
		return convenios.procurar(nome);
	}
	
	public Collection<Convenio> listarConvenios(){
		return convenios.listarConvenios();
	}
	
	public Convenio procurarConvenioNome(String nome) throws ConvenioInexistenteException {
		return convenios.procurarConvenioNome(nome);
	}
	// LABORATORIOS
	public void cadastrar(Laboratorio lab) throws LaboratorioExistenteException {
		laboratorios.cadastrar(lab);
	}	
	public void removerLab(int cod) throws LaboratorioInexistenteException {
		laboratorios.descadastrar(String.valueOf(cod));
	}
	public void atualizar(Laboratorio lab) throws LaboratorioInexistenteException {
		laboratorios.atualizar(lab);
	}
	public Laboratorio procurarLab(int cod) throws LaboratorioInexistenteException {
		return laboratorios.procurar(cod);
	}
	
	// EXAMES
	public void cadastrarExame(Exames exame) throws ExameExistenteException {
		exames.cadastrar(exame);
	}	
	public void removerExame(int cod) throws ExameInexistenteException {
		exames.descadastrar(String.valueOf(cod));
	}
	public void atualizarExame(Exames exame) throws ExameInexistenteException {
		exames.atualizar(exame);
	}
	public Exames procurarExame(int cod) throws ExameInexistenteException {
		return exames.procurar(String.valueOf(cod));
	}

	// CONSULTAS
	public void cadastrar(Consulta consulta) throws ConsultaExistenteException {
		consultas.cadastrar(consulta);
	}	
	public void removerConsulta(int cod) throws ConsultaInexistenteException {
		consultas.descadastrar(String.valueOf(cod));
	}
	public void atualizar(Consulta consulta) throws ConsultaInexistenteException {
		consultas.atualizar(consulta);
	}
	public Consulta procurarConsulta(int cod) throws ConsultaInexistenteException {
		return consultas.procurar(String.valueOf(cod));
	}
	
	
	
	
	
	
}
